import asyncio
import time


async def say_after(delay, what):
    start {delay} {what}")
    await asyncio.sleep(delay)
    print(what)


async def main():
    task1 = asyncio.create_task(say_after(1, 'hello1'))
    task2 = asyncio.create_task(say_after(2, 'world1'))
    # 上面两行执行之后没有任何打印，说明实际任务并没有执行

    print("task1 task2 create finish")
    time.sleep(2)

    # 2 秒之后开始执行
    print("start await hello2")
    # 按照 hello2 hello1 world1 启动任务，并阻塞等待 hello2 返回
    # 这个时候打印：start 1 hello2 , start 1 hello1, start 2 world1
    # hello 2 执行 1 秒后返回，打印 hello2
    await say_after(1, "hello2")
    print("end await hello 2")

    # 启动 world2 ，然后等待 world2 返回，但是hello1 先返回，就先打印 hello1 ，然后打印 world 1 ，然后是 world2
    await say_after(2, "world2")

    # asyncio 调度里面已经没有任务，后面两个 await 直接返回
    print("start await task 1")
    await task1
    print("start await task 2")
    await task2

asyncio.run(main())

"""result
hello2
hello1
world1
world2

task1 task2 create finish
---block and wait 2 senconds---
start await hello2
start 1 hello2
start 1 hello1
start 2 world1
hello2
end await hello 2
start 2 world2
hello1
world1
world2
start await task 1
start await task 2

有几个概念：
create_task：把参数的协程封装成一个 Task ,提交到 asyncio 调度。这时候 对应的 task 并没有运行。
await：查询 asyncio 调度是否有任务完成，启动没有启动的任务
具体的步骤写在程序注释中了

"""
